/** 
 * Speichert den Standort der Medien.
 * 
 * Alle Methoden mit setze...() weisen einer Variablen einen Wert zu.
 * Alle gib...() Methoden liefern den Wert der jeweiligen Variablen
 * zurueck. Alle ...Hinzufuegen() Methoden fuegen einen Wert einer Liste 
 * hinzu. 
 * 
 * Datei: Standort.java 		Autor: Simon Schindelmann 
 * Datum: 13.11.11                 	Version: 0.1
 * 
 */

package medienverwaltung;

import java.io.Serializable;
import java.util.ArrayList;
import medienverwaltung.simulation.Simulation;
import kommunikation.Wohnsitzadresse;


public class Standort implements Serializable
{
  private static final long serialVersionUID = 5133711123741513337L;
  private int standortId, laenge, breite;
  private String name;
  private ArrayList<Regal> regalListe = new ArrayList<Regal> ();
  private Wohnsitzadresse adresse;
  private Standortverwalter sv = new Standortverwalter ();


  public Standort (String name)
  {
    if (Simulation.istGenerator () == false)
    {
      Nummerngenerator n = new Nummerngenerator ();
      n.setzeZustand ();
      Simulation.setzeGenerator (true);
    }
    standortId = Nummerngenerator.generiereStandortId ();
    this.name = name;
  }


  public Standort (String name, String ort, String plz, 
      String hausnummer, String strasse, int laenge, int breite)
  {
    if (Simulation.istGenerator () == false)
    {
      Nummerngenerator n = new Nummerngenerator ();
      n.setzeZustand ();
      Simulation.setzeGenerator (true);
    }
    
    standortId = Nummerngenerator.generiereStandortId ();
    this.name = name;
    adresse = new Wohnsitzadresse (ort, plz, hausnummer, strasse);
    this.laenge = laenge;
    this.breite = breite;
  }

  
  /**
   * Erzeugt einen Standort mit Namen, Adresse, Laenge und Breite und
   * gibt diesen zurueck.
   * @param name Name des Standorts.
   * @param a Adresse des Standorts.
   * @param laenge Laenge des Standorts.
   * @param breite Breite des Standorts.
   */
  public Standort (String name, Wohnsitzadresse a, int laenge,
      int breite)
  {
    if (Simulation.istGenerator () == false)
    {
      Nummerngenerator n = new Nummerngenerator ();
      n.setzeZustand ();
      Simulation.setzeGenerator (true);
    }
    
    standortId = Nummerngenerator.generiereStandortId ();
    this.name = name;
    adresse = a;
    this.laenge = laenge;
    this.breite = breite;
  }

  
  /**
   * Hier wird der Name des Standortes gesetzt.
   * @param name Name des Standortes.
   */
  public void setzeName (String name)
  {
    this.name = name;
    sv.zustandSpeichern ();
  }

  
  /**
   * Hier wird die Adresse gesetzt.
   * @param ort Ort des Standortes.
   * @param plz Postleitzahl des Standortes.
   * @param hausnummer Hausnummer des Standortes.
   * @param strasse Strasse des Standortes.
   */
  public void setzeAdresse (String ort, String plz, String hausnummer,
      String strasse)
  {
    adresse = new Wohnsitzadresse (ort, plz, hausnummer, strasse);
    sv.zustandSpeichern ();
  }

  
  /**
   * Hier wird dem Standort ein Regalhinzugefuegt.
   * @param regal Regal das dem Standort hinzugefuegt wird.
   */
  public void regalHinzufuegen (Regal regal)
  {
    regalListe.add (regal);
    sv.zustandSpeichern ();
  }


  /**
   * Hier wird das Regal mit der entsprechenden ID entfernt.
   * @param id
   */
  public void regalEntfernen (int id)
  {
    Regal r = gibRegal (id);
    regalListe.remove (r);
    sv.zustandSpeichern ();
  }


  /**
   * Prueft ob ein Regal mit der entsprechenden ID vorhanden ist.
   * @param id ID des Regals.
   * @return Gibt true zurueck wenn das Regal mit der entsprechenden ID
   * vorahnden ist. Andernfalls false.
   */
  public boolean istRegalVorhanden (int id)
  {
    for (Regal r : regalListe)
    {
      if (r.gibRegalId () == id)
      {
        return true;
      }
    }
    return false;
  }


  /**
   * Gibt die anzahl der Regal zurueck.
   * @return Anzahl der Regale.
   */
  public int anzahlRegal ()
  {
    return regalListe.size ();
  }


  /**
   * Gibt das Regal mit der entsprechenden ID zurueck.
   * @param id ID des Regals.
   * @return Regal mit der entsprechenden ID.
   */
  public Regal gibRegal (int id)
  {
    for (Regal r : regalListe)
    {
      if (r.gibRegalId () == id)
      {
        return r;
      }
    }
    return null;
  }

  
  /**
   * Gibt den Ort des Standortes zurueck.
   * @return Ort des Standortes.
   */
  public String gibOrt ()
  {
    return adresse.gibOrt ();
  }


  /**
   * Gibt die Postleitzahl des des Standortes zurueck.
   * @return Postleitzahl des Standortes.
   */
  public String gibPlz ()
  {
    return adresse.gibPLZ ();
  }


  /**
   * Gibt die Hausnummer des Standortes zurueck.
   * @return Hausnummer des Standortes.
   */
  public String gibHausnummer ()
  {
    return adresse.gibGesamteHausnummer ();
  }


  /**
   * Gibt die Strasse des Standortes zurueck.
   * @return Strasses des Standortes.
   */
  public String gibStrasse ()
  {
    return adresse.gibStrasse ();
  }

  
  /**
   * Gibt die Laenge des Standortes zurueck.
   * @return Laenge des Standortes.
   */
  public int gibLaenge ()
  {
    return laenge;
  }

  
  /**
   * Setzt die Laenge des Standotes.
   * @param laenge Laenge des Standortes.
   */
  public void setzeLaenge (int laenge)
  {
    this.laenge = laenge;
    sv.zustandSpeichern ();
  }
  
  
  /**
   * Gibt die Breite des Standortes zurueck.
   * @return Breite des Standortes.
   */
  public int gibBreite ()
  {
    return breite;
  }

  
  /**
   * Setzt die Breite des Standortes.  
   * @param breite Breite des Standortes.
   */
  public void setzeBreite (int breite)
  {
    this.breite = breite;
    sv.zustandSpeichern ();
  }
  

  /**
   * Gibt die Standort ID zurueck.
   * @return ID des Standortes.
   */
  public int gibStandortId ()
  {
    return standortId;
  }

  /**
   * Gibt den Namen des Standortes zurueck.
   * @return Name des Standortes.
   */
  public String gibName ()
  {
    return name;
  }

  
  /**
   * Gibt eine Liste mit allen Regalen des Standortes zurueck.
   * @return ArrayListe mit den Regalen des Standortes.
   */
  public ArrayList<Regal> gibRegalListe ()
  {
    return regalListe;
  }


  /**
   * Gibt die Wohnsitzadresse des Standortes zurueck.
   * @return Wohnsitzadresse des Standortes.
   */
  public Wohnsitzadresse gibAdresse ()
  {
    return adresse;
  }

  
  /**
   * Mit dieser Methode kann alles am Standort geaendert werden.
   * @param name Name des Standortes.
   * @param ort Ort des Standortes.
   * @param plz Postleitzahl des Standortes.
   * @param hausnummer Hausnummer des Standortes.
   * @param strasse Strasse des Standortes.
   * @param laenge Laenge des Standortes.
   * @param breite Breite des Standortes.
   */
  public void allesAendern (String name, String ort, String plz,
      String hausnummer, String strasse, int laenge, int breite)
  {
    setzeName (name);
    setzeAdresse (ort, plz, hausnummer, strasse);
    setzeLaenge (laenge);
    setzeBreite (breite);
    sv.zustandSpeichern ();
  }
}
